﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Iudicium.Seguridad.CRN
{

    /// <summary>
    /// Descripción breve de UsuarioCRL
    /// </summary>
    public class UsuarioCRN
    {

        public static Usuario GetUsuarioByUserNameAndPassword(string userName, string password)
        {
            if(string.IsNullOrEmpty(userName))
            {
                throw new ArgumentException("El nombre de usuario no puede ser nulo o vacio.");
            }
            if (string.IsNullOrEmpty(password))
            {
                throw new ArgumentException("El password no puede ser nulo o vacio.");
            }
            UsuarioDSTableAdapters.UsuarioTableAdapter adapter =
                new UsuarioDSTableAdapters.UsuarioTableAdapter();

            UsuarioDS.UsuarioDataTable table = adapter.GetUsuarioByUserNameAndPassword(userName, password);

            if (table == null || table.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el registro del usuario desde la base de datos.");
            }

            return ConstruirUsuario(table[0]);
        }

        public static Usuario GetUsuarioByUserNameAndPassword(string userName)
        {
            if (string.IsNullOrEmpty(userName))
            {
                throw new ArgumentException("El nombre de usuario no puede ser nulo o vacio.");
            }

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter =
                new UsuarioDSTableAdapters.UsuarioTableAdapter();

            UsuarioDS.UsuarioDataTable table = adapter.GetUsuarioByUserName(userName);

            if (table == null || table.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el registro del usuario desde la base de datos.");
            }

            return ConstruirUsuario(table[0]);
        }

        public static Usuario GetUsuarioByUsuarioId(int usuarioId)
        {
            if (usuarioId <= 0)
            {
                throw new ArgumentException("El usuarioId no puede menor o igual a cero.");
            }

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter =
                new UsuarioDSTableAdapters.UsuarioTableAdapter();

            UsuarioDS.UsuarioDataTable table = adapter.GetUsuarioByUsuarioId(usuarioId);

            if (table == null || table.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el registro del usuario desde la base de datos.");
            }

            return ConstruirUsuario(table[0]);
        }

        public static bool InsertUsuario(Usuario user)
        {
            if (user == null)
            {
                throw new ArgumentException("El objecto Usuario no puede ser nulo.");
            }

            if (user.UsuarioId <= 0)
            {
                throw new ArgumentException("El UsuarioId no puede menor o igual a cero.");
            }

            if (string.IsNullOrEmpty(user.NombreUsuario))
            {
                throw new ArgumentException("El NombreUsuario no puede nulo o vacio.");
            }

            if (string.IsNullOrEmpty(user.Passsword))
            {
                throw new ArgumentException("El Passsword no puede nulo o vacio.");
            }

            if (user.RolId <= 0)
            {
                throw new ArgumentException("El RolId no puede menor o igual a cero.");
            }

            bool? inserted = false;

            UsuarioDSTableAdapters.UsuarioTableAdapter ada = new UsuarioDSTableAdapters.UsuarioTableAdapter();
            
            ada.InsertUsuario(user.UsuarioId, user.NombreUsuario, user.Passsword, user.RolId, user.Estado.ToString(), ref inserted);

            if (inserted == null)
                return false;

            return inserted.Value;
        }

        public static void UpdateUsuario(Usuario user)
        {
            if (user == null)
            {
                throw new ArgumentException("El objecto Usuario no puede ser nulo.");
            }

            if (user.UsuarioId <= 0)
            {
                throw new ArgumentException("El UsuarioId no puede menor o igual a cero.");
            }

            if (string.IsNullOrEmpty(user.NombreUsuario))
            {
                throw new ArgumentException("El NombreUsuario no puede nulo o vacio.");
            }
            
            if (user.RolId <= 0)
            {
                throw new ArgumentException("El RolId no puede menor o igual a cero.");
            }

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter = new UsuarioDSTableAdapters.UsuarioTableAdapter();

            adapter.UpdateUsuario(user.UsuarioId, user.NombreUsuario, user.RolId, user.Estado.ToString());

        }

        public static void DeleteUsuario(int usuarioId)
        {
            if (usuarioId <= 0)
            {
                throw new ArgumentException("El UsuarioId no puede menor o igual a cero.");
            }

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter = new UsuarioDSTableAdapters.UsuarioTableAdapter();

            adapter.DeleteUsuario(usuarioId);
        }

        public static void CambiarPassword(int usuarioId, string password)
        {
            if (usuarioId <= 0)
            {
                throw new ArgumentException("El usuarioId no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(password))
            {
                throw new ArgumentException("El password no puede ser nulo o vacio.");
            }

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter = new UsuarioDSTableAdapters.UsuarioTableAdapter();

            adapter.CambiarPassword(usuarioId, password);
        }

        public static List<ResultadoBusquedaUsuario> GetUsuariosBySearch(string searchTerm)
        {
            List<ResultadoBusquedaUsuario> lista = new List<ResultadoBusquedaUsuario>();

            if(searchTerm == null)
            {
                searchTerm = "";
            }

            UsuarioDSTableAdapters.SearchUsuariosTableAdapter adapter = new UsuarioDSTableAdapters.SearchUsuariosTableAdapter();

            UsuarioDS.SearchUsuariosDataTable tabla = adapter.GetUsuarioBySearch(searchTerm);

            if (tabla == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero los resultados obtenidos son nulos");
            }

            foreach (UsuarioDS.SearchUsuariosRow row in tabla)
            {
                ResultadoBusquedaUsuario user = new ResultadoBusquedaUsuario(row.usuarioId,
                    row.nombreUsuario, row.nombre, row.estado, row.nombreRol);
                lista.Add(user);
            }
            return lista;
        }

        public static bool ExisteUsuario(string nombreUsuario)
        {
            if (string.IsNullOrEmpty(nombreUsuario))
            {
                throw new Exception("El nombre de usuario no puede ser nulo o vacio.");
            }
            bool? existe = false;

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter = new UsuarioDSTableAdapters.UsuarioTableAdapter();

            adapter.ExisteUsuario(nombreUsuario, ref existe);

            if (existe == null)
                existe = false;

            return existe.Value;
        }

        private static Usuario ConstruirUsuario(UsuarioDS.UsuarioRow row)
        {
            if (row == null)
                return null;
            return new Usuario(row.usuarioId, row.nombreUsuario, row.password, row.rolId, Usuario.GetEstadoUsuarioByString(row.estado));
        }
    }
}